﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sisocana.Core.Interfaces;
using System.Linq.Expressions;
using Sisocana.Core.Models;
using Sisocana.Dal.Interfaces;
using Sisocana.Dal;
using Sisocana.Dal.EntityModels;

namespace Sisocana.Core
{
    public class DonacionService: ServiceBase<IDonacionModel>, IDonacionService 
    {


         public DonacionService()
            : this(new DonacionRepository())
        {
        }

        private IDonacionRepository _donacionRepository;
        public DonacionService(IDonacionRepository donacionRepository)
        {
            _donacionRepository = donacionRepository ?? new DonacionRepository();
        }

        // Bienes

        public void createDonacionBienesMapperEF2Model()
        {
            AutoMapper.Mapper.CreateMap<Direccion, DireccionModel>();
            AutoMapper.Mapper.CreateMap<Bienes, DonacionBienesModel>()
              .ForMember(dest => dest.idSitio, opt => opt.MapFrom(src => src.ONGDefinida.Sitio.id))
              .ForMember(dest => dest.NameOng, opt => opt.MapFrom(src => src.ONGDefinida.ONG.nombre))
              .ForMember(dest => dest.direccion, opt => opt.MapFrom(src => src.Direccion));
              //.ForMember(dest => dest.direccion.CP, opt => opt.MapFrom(src => src.Direccion.CP));
              
        }

        public void createDonacionBienesMapperModel2EF()
        {
            AutoMapper.Mapper.CreateMap<DonacionBienesModel, Bienes>();             
        }

        //Economica
        public void createDonacionEconomicaMapperEF2Model()
        {
            AutoMapper.Mapper.CreateMap<Economica, DonacionEconomicaModel>()
              .ForMember(dest => dest.idSitio, opt => opt.MapFrom(src => src.ONGDefinida.Sitio.id))
              .ForMember(dest => dest.NameOng, opt => opt.MapFrom(src => src.ONGDefinida.ONG.nombre));

        }

        public void createDonacionEconomicaMapperModel2EF()
        {
            AutoMapper.Mapper.CreateMap<DonacionEconomicaModel, Economica>();
        }

        //Servicios
        public void createDonacionServiciosMapperEF2Model()
        {
            AutoMapper.Mapper.CreateMap<Servicios, DonacionServiciosModel>()
              .ForMember(dest => dest.idSitio, opt => opt.MapFrom(src => src.ONGDefinida.Sitio.id))
              .ForMember(dest => dest.NameOng, opt => opt.MapFrom(src => src.ONGDefinida.ONG.nombre));

        }

        public void createDonacionServiciosMapperModel2EF()
        {
            AutoMapper.Mapper.CreateMap<DonacionServiciosModel, Servicios>();
        }

        public int updateDonacionEconomica(DonacionEconomicaModel rs)
        {
            throw new NotImplementedException();
        }

        public int deleteDonacionEconomica(DonacionEconomicaModel rs)
        {
            throw new NotImplementedException();
        }

        public DonacionEconomicaModel getDonacionEconomica(Expression<Func<DonacionEconomicaModel, bool>> whereCondition)
        {
            throw new NotImplementedException();
        }

        public IList<DonacionEconomicaModel> GetAllDonacionEconomica()
        {
            throw new NotImplementedException();
        }


        public int updateDonacionBienes(DonacionBienesModel rs)
        {
            throw new NotImplementedException();
        }

        public int deleteDonacionBienes(DonacionBienesModel rs)
        {
            throw new NotImplementedException();
        }

        public DonacionBienesModel getSigleDonacionBienes(Expression<Func<DonacionBienesModel, bool>> whereCondition)
        {
            throw new NotImplementedException();
        }

        public IList<DonacionBienesModel> GetAllDonacionBienes()
        {
            throw new NotImplementedException();
        }

        public int addDonacionServicios(DonacionServiciosModel dsm)
        {
            Servicios ds = new Servicios();
            ds.descripcion = dsm.descripcionDonacion;
            ds.fecha = DateTime.Now;
            ds.formaDonacion = dsm.formaDonacion;
            ds.nombreDelServicio = dsm.nombreDelServicio;
            ONGDefinidaRepository ongDR = new ONGDefinidaRepository();
            ONGDefinida ongD = ongDR.GetAll(o => o.id == dsm.idONGDefinida).First();
            ds.ONGDefinida = ongD;
            _donacionRepository.Add(ds);
            try
            {
                _donacionRepository.Save();
                return 0;
            }
            catch (Exception e)
            {
                return e.InnerException.GetHashCode();
            }
        }
        public int addDonacionBienes(DonacionBienesModel dbm)
        {
            Bienes db = new Bienes();
            db.cantidadDelBien = Convert.ToInt16(dbm.cantidadDelBien);
            db.descripcionDonacion = dbm.descripcionDonacion;
            db.fecha = DateTime.Now;
            db.nombreDelBien = dbm.nombreDelBien;
            
            ONGDefinidaRepository ongDR = new ONGDefinidaRepository();
            ONGDefinida ongD = ongDR.GetAll(o => o.id == dbm.idONGDefinida).First();
            db.ONGDefinida = ongD;
            
            AutoMapper.Mapper.CreateMap<DireccionModel, Direccion>();
            Direccion direccion = new Direccion();
            direccion = AutoMapper.Mapper.Map(dbm.direccion, direccion);
            db.Direccion = direccion;
            _donacionRepository.Add(db);

            try
            {
                _donacionRepository.Save();
                return 0;
            }
            catch (Exception e)
            {
                return e.InnerException.GetHashCode();
            }
        }

        public int addDonacionEconomica(DonacionEconomicaModel dem)
        {
            Economica de = new Economica();
            de.conPaypal = dem.conPaypal;
            de.fecha = DateTime.Now;
            de.cVVNumber = dem.cVVnumber;
            de.fechaVencimiento = dem.fechaVencimiento;
            de.monto = dem.monto;
            de.nombreTitular = dem.nombreTitular;
            de.numeroTarjeta = dem.nroTarjeta;
            de.tipoTarjeta = dem.tipoTarjeta;
            if (dem.conPaypal)
            {
                de.fechaVencimiento = DateTime.Now;
                de.paypalpayerID = dem.paypalpayerID;
                de.paypalToken = dem.transactionId;
            }
            ONGDefinidaRepository ongDR = new ONGDefinidaRepository();
            ONGDefinida ongD = ongDR.GetAll(o => o.id == dem.idONGDefinida).First();
            de.ONGDefinida = ongD;
            _donacionRepository.Add(de);

            try
            {
                _donacionRepository.Save();
                return 0;
            }
            catch (Exception e)
            {
                return e.InnerException.GetHashCode();
            }
        }

        public int updateDonacionServicios(DonacionServiciosModel rs)
        {
            throw new NotImplementedException();
        }

        public int deleteDonacionServicios(DonacionServiciosModel rs)
        {
            throw new NotImplementedException();
        }

        public DonacionServiciosModel getSigleDonacionServicios(Expression<Func<DonacionServiciosModel, bool>> whereCondition)
        {
            throw new NotImplementedException();
        }

        public IList<DonacionServiciosModel> GetAllDonacionServicios()
        {
            throw new NotImplementedException();
        }

        public Dal.EntityModels.Donacion GetSingle(Expression<Func<Dal.EntityModels.Donacion, bool>> whereCondition)
        {
            throw new NotImplementedException();
        }

        public void Add(Dal.EntityModels.Donacion entity)
        {
            throw new NotImplementedException();
        }

        public void Delete(Dal.EntityModels.Donacion entity)
        {
            throw new NotImplementedException();
        }

        public void Update(Dal.EntityModels.Donacion entity)
        {
            throw new NotImplementedException();
        }

        public IList<Dal.EntityModels.Donacion> GetAll(Expression<Func<Dal.EntityModels.Donacion, bool>> whereCondition)
        {
            throw new NotImplementedException();
        }

        IList<Dal.EntityModels.Donacion> IService<Dal.EntityModels.Donacion>.GetAll()
        {
            throw new NotImplementedException();
        }

        public IQueryable<Dal.EntityModels.Donacion> Query(Expression<Func<Dal.EntityModels.Donacion, bool>> whereCondition)
        {
            throw new NotImplementedException();
        }

        public long Count(Expression<Func<Dal.EntityModels.Donacion, bool>> whereCondition)
        {
            throw new NotImplementedException();
        }


        public IList<DonacionEconomicaModel> GetAllDonacionEconomica(Expression<Func<DonacionEconomicaModel, bool>> whereCondition)
        {
            createDonacionEconomicaMapperEF2Model();

            IList<Donacion> donacionesEF = _donacionRepository.GetAll();
            IEnumerable<Economica> bienesEF = donacionesEF.OfType<Economica>();

            List<DonacionEconomicaModel> donBienes = new List<DonacionEconomicaModel>();

            donBienes = AutoMapper.Mapper.Map(bienesEF, donBienes);

            IQueryable<DonacionEconomicaModel> donBienesRet = donBienes.AsQueryable<DonacionEconomicaModel>().Where(whereCondition);

            List<DonacionEconomicaModel> ret = donBienesRet.ToList();
            donBienesRet = donBienesRet.OrderBy(ln => ln.fecha);            
            return ret;
        }

        public IList<DonacionBienesModel> GetAllDonacionBienes(Expression<Func<DonacionBienesModel, bool>> whereCondition)
        {
            //
            createDonacionBienesMapperEF2Model();
            IList<Donacion> donacionesEF = _donacionRepository.GetAll();

            
            IEnumerable<Bienes> bienesEF = donacionesEF.OfType<Bienes>();

            
            List<DonacionBienesModel> donBienes = new List<DonacionBienesModel>();

            donBienes = AutoMapper.Mapper.Map(bienesEF, donBienes);

            IQueryable<DonacionBienesModel> donBienesRet = donBienes.AsQueryable<DonacionBienesModel>().Where(whereCondition);

            donBienesRet = donBienesRet.OrderBy(ln => ln.fecha);
            List<DonacionBienesModel> ret = donBienesRet.ToList();

            return ret;            
        }

        public IList<DonacionServiciosModel> GetAllDonacionServicios(Expression<Func<DonacionServiciosModel, bool>> whereCondition)
        {
            createDonacionServiciosMapperEF2Model();

            IList<Donacion> donacionesEF = _donacionRepository.GetAll();
            IEnumerable<Servicios> bienesEF = donacionesEF.OfType<Servicios>();

            List<DonacionServiciosModel> donBienes = new List<DonacionServiciosModel>();

            donBienes = AutoMapper.Mapper.Map(bienesEF, donBienes);

            IQueryable<DonacionServiciosModel> donBienesRet = donBienes.AsQueryable<DonacionServiciosModel>().Where(whereCondition);
            donBienesRet = donBienesRet.OrderBy(ln => ln.fecha);
            List<DonacionServiciosModel> ret = donBienesRet.ToList();

            return ret;
        }


       
      
    }
}
